<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    'use strict';//使用严格模式


    /**
     * 在js中，带var 和function关键字的需要预解释：
     * 带有function关键字的，在整个js脚本执行之前，就已经把函数名在内存里安排好了，并且给这个函数名赋值了，就是把函数体也赋值给了函数名；
     * 带有var关键字的，在js申明的时候只是申明有这个变量了，不给赋值，在预解释完成之后运行js代码的时候才给赋值；
     */
     /*
     var m=0;
     var n=1;
     function fn(){
        alert(n);//alert undefined
        alert(m);//alert 0
        n=4;
        var  n=5;
        alert(n) // alert 5
    }
     fn();
     */
     /**
    console.log(a);// undefined 只申明未定义（未赋值）
    var a = 1;
    console.log(a);//1
    */

    /*
    //let定义变量，没有提前申明（即没有预解释）
    console.log(a);// a is not defined
    let a = 1;
    console.log(a);//直接报错不执行
    */

    /*
    在var function 预解释中，遇到变量已被申明时，不再声明，但可以被赋值
     */
    /*
    var b = 12;//b被声明
    var b = 13;//b已被申明，不再声明，被赋值为13

    //b已被申明，不再预解释，function声明
    function b(){
        console.log(b)
    }
     console.log(b)//结果13
    b();//b is not a function
    */

    /*
    let b定义的变量不能重新定义（无论是函数还是let定义的变量，都不可以重复定义）
     let b = 13;
     let b = 14;//Identifier 'b' has already been declared

     let c = 15;
     function c(){//直接报错 Identifier 'c' has already been declared

     }
     */

    /*
    console.log(A);//A is not defined
    let A = 1;
    */

    /*

   //下面这一段js执行的效果是Identifier 'A' has already been declared，而不是A is not defined
   // 虽然let变量不进行预解释，但是代码执行之前，现将定义的变量过滤一遍，一旦发现不合法，就直接报错了
    console.log(A)
    let A = 1;
    let A = 3;
    */







</script>
</body>
</html>